From 4da945dc4be6bb1bd14000927c2092053cea3659 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sun, 2 Aug 2015 12:37:03 -0700 Subject: [PATCH] widget: Don't queue redraws for properties that don't affect anything Properties like transition-property might change when hovering over something, even if the property itself does not change. These properties don't affect drawing, so don't queue redraws for them. --- gtk/gtkcsstypesprivate.h | 9 +++++++++ gtk/gtkwidget.c | 9 ++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index 4018048a45..898051efe4 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -134,6 +134,15 @@ typedef enum { GTK_CSS_AFFECTS_SIZE = (1 << 9) } GtkCssAffects; +#define GTK_CSS_AFFECTS_REDRAW (GTK_CSS_AFFECTS_FOREGROUND | \ + GTK_CSS_AFFECTS_BACKGROUND | \ + GTK_CSS_AFFECTS_BORDER | \ + GTK_CSS_AFFECTS_FONT | \ + GTK_CSS_AFFECTS_TEXT | \ + GTK_CSS_AFFECTS_TEXT_ATTRS | \ + GTK_CSS_AFFECTS_ICON | \ + GTK_CSS_AFFECTS_OUTLINE) + enum { /*< skip >*/ GTK_CSS_PROPERTY_COLOR, GTK_CSS_PROPERTY_DPI, diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 37348ad8d1..2f3b142352 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -8250,14 +8250,17 @@ gtk_widget_real_style_updated (GtkWidget *widget) if (widget->priv->anchored) { - static GtkBitmask *affects_size = NULL; + static GtkBitmask *affects_size, *affects_redraw; if (G_UNLIKELY (affects_size == NULL)) - affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP); + { + affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP); + affects_redraw = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_REDRAW); + } if (changes == NULL || _gtk_bitmask_intersects (changes, affects_size)) gtk_widget_queue_resize (widget); - else + else if (_gtk_bitmask_intersects (changes, affects_redraw)) gtk_widget_queue_draw (widget); } } -- 2.30.2